package com.tulele.vtool.utils;

import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.info.AudioInfo;
import ws.schild.jave.info.VideoInfo;
import ws.schild.jave.info.VideoSize;

import java.io.File;

/**
 * 多媒体(音频、视频)文件压缩工具类
 */
public class MultimediaCompressionUtil {
    /**
     * 视频转码
     * @param source 视频资源
     * @param target 压缩后视频资源
     * @return 压缩后的文件
     */
    public static File compressionVideo(File source, File target) {
        // 音频
        int audioMaxBitRate = 128000;// 音频最大比特率
        int audioMaxSamplingRate = 8000;// 音频最大采样率

        // 视频
        int maxWidth = 640;// 设置视频最大宽度
        int videoMaxBitRate = 512000;// 视频最大比特率
        int maxFrameRate = 20;// 视频帧率

        MultimediaObject object = new MultimediaObject(source);
        try {
            // 第一部分：audio stream
            AudioInfo audio = object.getInfo().getAudio();
            AudioAttributes audioAtt = new AudioAttributes();
            // 1.1 音频格式
            audioAtt.setCodec("aac");
            // 1.2 音频比特率(128K以下AAC最强，128－192WMA无敌，192以上MP3为首选)
            if (audio.getBitRate() > audioMaxBitRate) {
                audioAtt.setBitRate(audioMaxBitRate);
            }
            // 1.3 声道
            audioAtt.setChannels(2);// 双声道
            // 1.4 音频采样率
            if (audio.getSamplingRate() > audioMaxSamplingRate) {
                audioAtt.setSamplingRate(audioMaxSamplingRate);
            }

            // 第二部分：video stream
            VideoInfo video = object.getInfo().getVideo();// 视频
            VideoAttributes videAtt = new VideoAttributes();// 视频属性
            VideoSize size = video.getSize();// 大小
            Integer width = size.getWidth();// 宽
            Integer height = size.getHeight();// 高

            // 2.1 视频宽高
            if (width == null || width.equals(0)) {
                videAtt.setSize(new VideoSize(maxWidth, 480));
            } else {
                if(width > maxWidth){
                    float rat = (float) width / maxWidth;
                    videAtt.setSize(new VideoSize(maxWidth, (int) (height / rat)));
                }
            }
            // 2.2 视频编码
            videAtt.setCodec("h264");
            // 2.3 视频比特率
            if (video.getBitRate() > videoMaxBitRate) {
                videAtt.setBitRate(videoMaxBitRate);
            }
            // 2.4 视频帧率
            if (video.getFrameRate() > maxFrameRate) {
                videAtt.setFrameRate(maxFrameRate);
            }
            // 2.5 视频质量
            videAtt.setQuality(4);

            EncodingAttributes attrs = new EncodingAttributes();
            attrs.setOutputFormat("mp4");
            attrs.setAudioAttributes(audioAtt);
            attrs.setVideoAttributes(videAtt);

            Encoder encoder = new Encoder();
            encoder.encode(object, target, attrs);

            // 如果压缩后的文件大小 大于 原文件，直接使用原文件
            if (target.length() > source.length()) {
                return source;
            }
        } catch (Exception e) {
//            e.printStackTrace();
            // 如果转码失败，则使用原文件
            return source;
        }
        return target;
    }

    /**
     * 音频转码
     * @param source 音频资源
     * @param target 压缩后的音频资源
     * @return 压缩后的文件
     */
    public static File compressionAudio(File source, File target){
        // 音频
        int audioMaxBitRate = 192000;// 音频最大比特率
        int audioMaxSamplingRate = 44100;// 音频最大采样率

        try {
            MultimediaObject object = new MultimediaObject(source);
            AudioInfo audioInfo = object.getInfo().getAudio();

            AudioAttributes audio = new AudioAttributes();
            audio.setCodec("libmp3lame");
            if (audioInfo.getBitRate() > audioMaxBitRate) {
                audio.setBitRate(audioMaxBitRate);
            }
            audio.setChannels(2);
            if (audioInfo.getSamplingRate() > audioMaxSamplingRate) {
                audio.setSamplingRate(audioMaxSamplingRate);
            }

            EncodingAttributes attrs = new EncodingAttributes();
            attrs.setOutputFormat("mp3");
            attrs.setAudioAttributes(audio);
            Encoder encoder = new Encoder();
            encoder.encode(new MultimediaObject(source), target, attrs);

            // 如果压缩后的文件大小 大于 原文件，直接使用原文件
            if (target.length() > source.length()) {
                return source;
            }
        } catch (EncoderException e) {
            // e.printStackTrace();
            // 如果转码失败，则使用原文件
            return source;
        }
        return target;
    }
}
